package com.dream.xiaobo.controller;

import com.dream.xiaobo.entity.User;
import com.dream.xiaobo.service.impl.UserServiceImpl;
import com.dream.xiaobo.utils.*;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.sql.SQLException;
import java.util.Map;

/**
 * @author xiaobo
 * @date 2021/8/27 - 21:21
 * 用户模块
 */
@WebServlet("/user")
public class UserController extends BaseServlet {

    //创建UserServiceImpl实例化对象
    private UserServiceImpl userService = new UserServiceImpl();

    /**
     * 接受ajax、检查注册的用户是否存在
     * @param request
     * @param response
     * @return
     */
    public String check(HttpServletRequest request, HttpServletResponse response) throws SQLException {

        //获得输入的用户名、校验是否存在
        String username = request.getParameter("username");

        //如果用户名没输入、则不能注册、1：不通过、0：通过
        if (null == username) {
            return Constants.HAS_USER;
        }

        //调用checkUser业务逻辑方法
        boolean user = userService.checkUser(username);

        //判断数据库中是否存在此用户、如果存在则提示
        if (user) {
            return Constants.HAS_USER;
        }

        return Constants.NOT_HAS_USER;
    }

    /**
     * 注册功能
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
    public String register(HttpServletRequest request, HttpServletResponse response) {

        //用Map集合存放拿到的输入相关信息
        Map<String, String[]> parameterMap = request.getParameterMap();

        //创建User实例对象
        User user = new User();

        try {
            //map中的数据映射到JavaBean中的get和set方法中（封装数据到JavaBean中）
            BeanUtils.populate(user,parameterMap);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        //为此添加一个不重复的激活码
        user.setuCode(RandomUtils.createActive());
        //添加状态 0：未激活、 1：激活
        user.setuStatus(Constants.USER_NOT_ACTIVE);
        //添加角色身份、0：消费者  1：管理员
        user.setuRole(Constants.ROLE_CUSTOMER);
        //添加密码用MD5加密处理
        user.setuPassword(MD5Utils.md5(user.getuPassword()));

        try {
            //调用注册逻辑
            userService.rigistUser(user);
        } catch (SQLException e) {
            e.printStackTrace();
            //失败、返回提示信息
            request.setAttribute("registerMsg","注册失败");
            //返回注册页面
            return Constants.FOR_WARD + "/register.jsp";
        }
        //返回注册成功页面
        return Constants.FOR_WARD + "/registerSuccess.jsp";
    }

    /**
     * 激活功能
     * @param request
     * @param response
     * @return
     */
    public String active(HttpServletRequest request, HttpServletResponse response) throws SQLException {
        //1.获取激活码、已经转成base64
        String c = request.getParameter("c");
        //base64反转
        String code = Base64Utils.decode(c);
        //2.调用激活的业务逻辑
        int i = userService.activeUser(code);

        //3.响应(激活失败（code没有找到） 已经激活 激活成功)
        if (i == Constants.ACTIVE_FAIL){
            request.setAttribute("msg","未激活成功！");
        }else if(i==Constants.ACTIVE_SUCCESS){
            request.setAttribute("msg","激活成功，请登录！");
        }else{
            request.setAttribute("msg","已经激活");
        }
        //返回激活提示信息页面
        return Constants.FOR_WARD+"/message.jsp";
    }

    /**
     * 登录功能
     * @param request
     * @param response
     * @return
     */
    public String login(HttpServletRequest request,HttpServletResponse response) throws SQLException {

        //获取输入的用户名
        String username = request.getParameter("username");
        //获取输入的密码
        String password = request.getParameter("password");
        //获取输入的验证码
        String code = request.getParameter("code");
        //获取自动登录信息
        String auto = request.getParameter("auto");
        //获取session中的验证码
        String codeStr = (String) request.getSession().getAttribute("code");
        //当验证码为空时或输入的验证码不等于图片中的验证码时
        if(code == null || !code.equalsIgnoreCase(codeStr)){

            //返回提示信息
            request.setAttribute("msg","验证码错误");

            //返回登录页面
            return Constants.FOR_WARD + "/login.jsp";
        }

        //调用登录逻辑
        User user = userService.loginUser(username, password);

        //当返回的user对象为空时
        if(null == user){
            //返回提示信息
            request.setAttribute("msg","用户名或密码错误");
            //返回登录页面
            return Constants.FOR_WARD + "/login.jsp";
        }
        //当激活状态为0时
        if(user.getuStatus().equals(Constants.USER_NOT_ACTIVE)){
            //返回提示信息
            request.setAttribute("msg","账号未激活");
            //返回登录页面
            return Constants.FOR_WARD + "login.jsp";
        }

        //将user对象放在Session中返回
        request.getSession().setAttribute("loginUser",user);

        //当选择自动登录时
        if(auto != null){
            //将用户名和密码放在一起
            String content = username + Constants.FLAG + password;
            //用Base64修改一下
            content = Base64Utils.encode(content);
            //将信息放进Cooke中
            Cookie cookie = new Cookie(Constants.AUTO_NAME,content);
            //可在同一应用服务器内共享方法
            cookie.setPath("/");
            //设置保存时间 单位s
            cookie.setMaxAge(14 * 24 * 60 * 60);
            //将Cooke保存到浏览器中
            response.addCookie(cookie);
        }else{
            Cookie cookie = new Cookie(Constants.AUTO_NAME,"");
            //可在同一应用服务器内共享方法
            cookie.setPath("/");
            //设置保存时间 单位s
            cookie.setMaxAge(0);
            //将Cooke保存到浏览器中
            response.addCookie(cookie);
        }
        //返回到首页
        return Constants.REDIRECT + "/index.jsp";
    }

    /**
     * 注销登录功能
     * @param request
     * @param response
     * @return
     */
    public String logOut(HttpServletRequest request,HttpServletResponse response){

        //销毁Session
        request.getSession().invalidate();

        //清空Cooke
        Cookie cookie = new Cookie(Constants.AUTO_NAME,"");
        cookie.setPath("/");
        cookie.setMaxAge(0);
        response.addCookie(cookie);

        //返回提示信息
        request.setAttribute("msg","注销登录成功！");
        //返回到登录页面
        return Constants.FOR_WARD + "/login.jsp";
    }
}
